package com.adastros.buildingmanager.model;

import java.awt.Image;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.UUID;

public class Receipt {

  public enum Kind {
    // El primer bit está a 1 para indicar que sin cuotas.
    NORMAL_FEE("Cuota normal de mantenimiento", 0x1), 
    EXTRA_FEE("Cuota extraordinaria", 0x2), 

    // Servicio de planilla. Las nóminas
    PAYSHEET_SERVICE_FEE("Nómina", 0x4),
        
    // Servicios básicos comunes
    LIGHT_SERVICE_FEE("Servicio de luz", 0x8),
    PHONE_SERVICE_FEE("Servicio de teléfono", 0x10),
    WATER_SERVICE_FEE("Servicio de agua", 0x20),     
    
    // Serivio genérico
    GENERIC_SERVICE_FEE("Servicio genérico", 0x8000) ;
    
    private final String name ;    
    private final int id ;
    
    private Kind(String name, int id) {
      this.name = name ;
      this.id = id ;
    }
    
    public boolean isQuota() {
      return (id & 0x3) != 0 ;
    }
    
    public boolean isPaySheet() {
      return 0x4 == id ; 
    }
    
    public boolean isService() {
      return 0x4 < id ;
    }
    
    public boolean isRegularService() {
      return (id & 0x38) != 0 ;
    }
    
    public int getId() {
      return id ;
    }
    
    @Override
    public String toString() {
      return name ;
    }        
  }
  
  public enum State {
    PAID("Pagado"), PENDING("Pendiente"), PARCIAL_PAID("Pagado parcialmente") ;
    
    private final String name ;    
    
    private State(String name) {
      this.name = name ;
    }
    
    @Override
    public String toString() {
      return name ;
    }            
  }
  
  /**
   * Identificador del recibo.
   */
  private UUID id ;
  
  /**
   * Tipo de recibo
   */
  private Kind kind ;
  
  /**
   * El estado en el que está el recibo, pagado, pendiente o pagado parcialmente.
   */
  private State state ;
  
  /**
   * El monto total del recibo
   */
  private BigDecimal amount ;
  
  /**
   * La parte que todavía no ha sido cancelada.
   */
  private BigDecimal balance ;
  
  /**
   * Fecha en la que fue emitido el recibo.
   */
  private Date emissionDate ;
  
  /**
   * Fecha en la que fue pagado el recibo.
   */
  private Date paidDate ;
  
  /**
   * Última fecha para poder pagar el recibo sin que se generen moras, cortes del servicio, etc...
   */
  private Date lastPaidDate ;
 
  /**
   * Que persona emite el recibo si es que ha sido emitido.
   */
  private Person fromPerson ;
  
  /**
   * Personas a las que va emitido el recibo.
   */
  private List<Person> toPersons ;
   
  /**
   * Descripción de para que es el recibo.
   */
  private String description ;
  
  /**
   * Número de recibo que se ve en el propio recibo.
   */
  private String receiptNumber ;
  
  
  /**
   * Número de identificación fiscal, el RUC.
   */
  private String fiscalID ;
  
  /**
   * Imagen del recibo original escaneado.
   */
  private Image receiptImage ;
  
  public Receipt() {
  }
}